package com.atguigu.tingshu.album.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.BaseAttributeValueMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;
    @Autowired
    private AlbumStatMapper albumStatMapper;
    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<AlbumInfo> getUserAllAlbumList(Long userId) {
        LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AlbumInfo::getUserId,userId);
        queryWrapper.select(AlbumInfo::getId,AlbumInfo::getAlbumTitle,AlbumInfo::getStatus);
        queryWrapper.last("limit 200");
        queryWrapper.orderByDesc(AlbumInfo::getUpdateTime);
        List<AlbumInfo> albumInfoList = albumInfoMapper.selectList(queryWrapper);
        return albumInfoList;
    }

    @Override
    public AlbumStatVo getAlbumStatVo(Long albumId) {
        return albumStatMapper.selectAlbumStatVo(albumId);
    }

    @Override
    public AlbumInfo getAlbumInfoById(Long id) {


        String datakey = RedisConstant.ALBUM_INFO_PREFIX + id;
        AlbumInfo albumInfo = (AlbumInfo) redisTemplate.opsForValue().get(datakey);
        albumInfo = this.getAlbumInfoDB(id);

        return albumInfo;
    }

    public AlbumInfo getAlbumInfoDB(Long id) {
        AlbumInfo albumInfo = albumInfoMapper.selectById(id);
        LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, id);
        List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(queryWrapper);

        if (albumInfo != null) {
            albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
        }
        return albumInfo;
    }

//    @Override
//    public AlbumInfo getAlbumInfoById(Long id) {
//        AlbumInfo albumInfo = albumInfoMapper.selectById(id);
//        LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<AlbumAttributeValue>()
//                .eq(AlbumAttributeValue::getAlbumId, id);
//        List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(queryWrapper);
//
//        if (albumInfo!=null){
//            albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
//        }
//        return albumInfo;
//    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
        AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
        albumInfo.setUserId(userId);
        albumInfo.setTracksForFree(5);
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        albumInfoMapper.insert(albumInfo);
        Long albumId = albumInfo.getId();

        List<AlbumAttributeValueVo> attrValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (CollectionUtil.isEmpty(attrValueVoList)){
            throw new GuiguException(500,"新增专辑必须选择专辑属性");
        }
        for (AlbumAttributeValueVo attrValueVo : attrValueVoList) {
            AlbumAttributeValue albumAttrValue = BeanUtil.copyProperties(attrValueVo, AlbumAttributeValue.class);
            albumAttrValue.setAlbumId(albumId);
            albumAttributeValueMapper.insert(albumAttrValue);
        }

        saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0);
        saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0);
        saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0);
        saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0);

    }

    public void saveAlbumStat(Long albumId, String statType, int statNum) {
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(albumId);
        albumStat.setStatType(statType);
        albumStat.setStatNum(statNum);
        albumStatMapper.insert(albumStat);
    }

    @Override
    public Page<AlbumListVo> getUserAlbumPage(Page<AlbumListVo> albumListVoPage, AlbumInfoQuery albumInfoQuery) {
        Page<AlbumListVo> albumVoPage = albumInfoMapper.getUserAlbumPage(albumListVoPage, albumInfoQuery);
        return albumVoPage;
    }
}

